/**
 * 
 */
package com.fidelizarte.ejb.servicio.impl;

import static com.fidelizarte.common.util.ConstantesApplication.ESTADO_ACTIVO;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fidelizarte.common.enums.EnumTipoTransaccion;
import com.fidelizarte.common.util.CatalogoCabeceraConstantes;
import com.fidelizarte.common.util.EncriptacionUtil;
import com.fidelizarte.common.util.MessagesApplicacion;
import com.fidelizarte.common.util.SeguridadesException;
import com.fidelizarte.common.util.UtilAplication;
import com.fidelizarte.ejb.persistence.dao.FactoryDAO;
import com.fidelizarte.ejb.persistence.dao.impl.CampaniaDAO;
import com.fidelizarte.ejb.persistence.dao.impl.TipoCampaniaDAO;
import com.fidelizarte.ejb.persistence.dao.impl.TipoMenuDAO;
//import com.mpo.ejb.persistence.entities.Modulo;
import com.fidelizarte.ejb.persistence.entities.HistoricoClave;
import com.fidelizarte.ejb.persistence.entities.HistoricoTransaccione;
import com.fidelizarte.ejb.persistence.entities.Menu;
import com.fidelizarte.ejb.persistence.entities.Parametro;
import com.fidelizarte.ejb.persistence.entities.Perfil;
import com.fidelizarte.ejb.persistence.entities.TipoMenu;
import com.fidelizarte.ejb.persistence.entities.Usuario;
import com.fidelizarte.ejb.persistence.util.dto.CredencialesDTO;
import com.fidelizarte.ejb.persistence.util.dto.MenuDTO;
import com.fidelizarte.ejb.persistence.util.dto.TipoMenuDTO;
import com.fidelizarte.ejb.persistence.vo.LoginMenuVO;
import com.fidelizarte.ejb.persistence.vo.LoginVO;
import com.fidelizarte.ejb.servicio.ServicioLogin;

/**
 * @author 
 *
 */
@Stateless
public class ServicioLoginImpl implements ServicioLogin{
	
	private static final Logger slf4jLogger = LoggerFactory.getLogger(ServicioLoginImpl.class);
	
	@EJB
	private FactoryDAO factoryDAO;
	@EJB
	private TipoMenuDAO tipoMenuDAO;

	@Override
	@TransactionAttribute (TransactionAttributeType.REQUIRED)
	public LoginVO autenticarUsuario(LoginVO loginVO) throws SeguridadesException {
		
		slf4jLogger.info("metodo autenticarUsuario");
		
		LoginVO loginVOUsuario = null;
		
		try {
			
			CredencialesDTO credencialesDTO = loginVO.getCredencialesDTO();
			
//			slf4jLogger.info("credencialesDTO.getPassword {}", credencialesDTO.getPassword());
			//String claveEncriptada = EncriptacionUtil.getInstancia().encriptar(credencialesDTO.getPassword());
			String claveEncriptada=credencialesDTO.getPassword();
//			slf4jLogger.info("claveEncriptada {}", claveEncriptada);
			credencialesDTO.setPassword(claveEncriptada);
			
			Usuario usuarioLogueado = factoryDAO.getUsuarioDAOImpl().obtenerPorLogin(credencialesDTO);
			
				if (usuarioLogueado != null) {
				
				loginVOUsuario = new LoginVO();
				loginVOUsuario.setCredencialesDTO(loginVO.getCredencialesDTO());
				
				usuarioLogueado.setNpDebeCambiarClave(this.debeCambiarClave(usuarioLogueado));
				usuarioLogueado.setFechaUltAcceso(UtilAplication.obtenerFechaActual());
				
				factoryDAO.getUsuarioDAOImpl().update(usuarioLogueado);
				
				//obtener los modulos del usuario
				//List<Modulo> modulosUsuario = factoryDAO.getModuloDAOImpl().obtenerModuloUsuario(usuarioLogueado);
				
				List<Perfil> modulosUsuario = factoryDAO.getPerfilDAOImpl().obtenerModuloUsuario(usuarioLogueado);
				
				if (CollectionUtils.isNotEmpty(modulosUsuario)) {
				for (Perfil modulo: modulosUsuario) {
						modulo.getMenus().size();
					}
					//loginVOUsuario.setColModuloUsuario(modulosUsuario);
				loginVOUsuario.setColPerfilUsuario(modulosUsuario);
				}
				
				HistoricoTransaccione historicoTransacciones = new HistoricoTransaccione();
				historicoTransacciones.setNombreTransaccion(UtilAplication.appendStringBuilder(ServicioLoginImpl.class.getName(), " ", "autenticarUsuario").toString());
				historicoTransacciones.setFechaTransaccion(UtilAplication.obtenerFechaActual());
				historicoTransacciones.setCabCatalogoTipoTransaccion(CatalogoCabeceraConstantes.ID_CAB_CATALOGO_TIPO_TRANSACCION);
				historicoTransacciones.setDetCatalogoTipoTransaccion(EnumTipoTransaccion.LOGIN.getId());
				historicoTransacciones.setUsuario(usuarioLogueado);
				
				factoryDAO.getHistoricoTransaccioneDAOImpl().create(historicoTransacciones);
				
				loginVOUsuario.setUsuario(usuarioLogueado);
			
				
			}
			
		} catch (Exception e) {
			throw new SeguridadesException(e.getMessage());
		}
		
		return loginVOUsuario;
	}

	@Override
	public Usuario cambiarClaveUsuario(Usuario usuario) throws SeguridadesException {
		
		slf4jLogger.info("metodo cambiarClaveUsuario");
		Usuario usuarioUpdate = null;
		try {
			
			usuario.setFechaCambioClave(UtilAplication.obtenerFechaActual());
			String claveEncriptada = /*EncriptacionUtil.getInstancia().encriptar(*/usuario. getPass();
			usuario.setPass(claveEncriptada);
			
			usuarioUpdate = factoryDAO.getUsuarioDAOImpl().update(usuario);
			
			if (usuarioUpdate != null) {
				usuarioUpdate.setNpDebeCambiarClave(Boolean.FALSE);
				
				HistoricoClave historialClave = new HistoricoClave();
				historialClave.setUsuario(new Usuario());
				historialClave.getUsuario().setIdUsuario(usuarioUpdate.getIdUsuario());
				historialClave.setPassUsuario(/*EncriptacionUtil.getInstancia().encriptar(*/usuarioUpdate.getNpPasswordTemp());
				historialClave.setFechRegistro(UtilAplication.obtenerFechaActual());
				factoryDAO.getHistorialClaveDAOImpl().create(historialClave);
				
				historialClave = null;
			}
			
			claveEncriptada = null;
			/**/
		} catch (Exception e) {
			slf4jLogger.info("no se pudo cambiarClaveUsuario {}", e.toString());
			throw new SeguridadesException(e);
		}
		
		return usuarioUpdate;
	}

	@Override
	public Boolean validarClaveUsuario(Usuario usuario) throws SeguridadesException {
		
	/*	HistorialClave historialClave = new HistorialClave();
		historialClave.setSegtUsuario(new Usuario());
		historialClave.getSegtUsuario().setIdUsuario(usuario.getIdUsuario());
		historialClave.setPassUsuario(EncriptacionUtil.getInstancia().encriptar(usuario.getNpPasswordTemp()));
		
		List<HistorialClave> listaHistoricoClaves = factoryDAO.getHistorialClaveDAOImpl().obtenerHistorialClaveCriterios(historialClave);
		
		if (!CollectionUtils.isEmpty(listaHistoricoClaves)) {
			return Boolean.TRUE;
		}
		*/
		return Boolean.FALSE;
	}
	
	private Boolean debeCambiarClave (Usuario usuario) throws SeguridadesException{
		
		// si es el primer ingreso se debe cambiar la clave
	/*	if (usuario.getFechaUltimoIngreso()== null) {
			return Boolean.TRUE;
		}
		
		// se verifica la ultima ves que cambio la clave y se compara con el tiempo que se usa como parametro
		Parametro parametroPlantilla = new Parametro();
		parametroPlantilla.setEstado(ESTADO_ACTIVO);
		parametroPlantilla.setIdParametro(MessagesApplicacion.getInteger("erp.parametro.cambiar.clave.id"));
		List<Parametro> parametroCol = factoryDAO.getParametroDAOImpl().buscarParametroCriterios(parametroPlantilla);
		
		if (CollectionUtils.isNotEmpty(parametroCol) && parametroCol.size()==1) {
			Parametro parametro = parametroCol.get(0);
			
			if (StringUtils.isNotBlank(parametro.getValorParametro())) {
				
				Long numeroDias = Long.valueOf(parametro.getValorParametro());
				Timestamp fechaMaximoCambioClave = UtilAplication.sumarDiasTimestamp(usuario.getFechaCambioClave(),numeroDias);
				Timestamp fechaActual = UtilAplication.obtenerFechaActual();
				
				if (fechaActual.getTime() > fechaMaximoCambioClave.getTime()) {
					return Boolean.TRUE;
				}
			}
		}
		*/
		return Boolean.FALSE;
		
	}
	@Override
	@TransactionAttribute (TransactionAttributeType.REQUIRED)
	public LoginMenuVO obtenerMenusPorIdPerfilFrontend(Integer perfil) throws SeguridadesException{
		slf4jLogger.info("metodo obtenerMenusPorIdPerfil session bean");
		List<Menu> menus= new ArrayList<Menu>();
		List<MenuDTO> menusDTO= new ArrayList<MenuDTO>();
		List<TipoMenuDTO> tiposMenuDTO= new ArrayList<TipoMenuDTO>();
		LoginMenuVO loginMenuVO= new LoginMenuVO(); 
try {
			
	 menus= factoryDAO.getMenuDAOImpl().obtenerMenusPorIdPerfil(perfil);
		for (Menu menu : menus) {
			
			MenuDTO menuDTO=new MenuDTO();
			menuDTO.setIdMenu(menu.getIdMenu());
			menuDTO.setMenu(menu.getNombreMenu());
			menuDTO.setUrlMenu(menu.getUrlMenu());
			if(menu.getTipoMenu()!=null)
			menuDTO.setIdTipoMenu(menu.getTipoMenu().getIdTipoMenu());
			
			menusDTO.add(menuDTO);
			if(menu.getTipoMenu()!=null)
			{
				Integer idTipoMenu=menu.getTipoMenu().getIdTipoMenu();
				TipoMenu tipoMenu=new TipoMenu();
				TipoMenuDTO tipoMenuDTO=new TipoMenuDTO();
				tipoMenu=tipoMenuDAO.buscarPorId( idTipoMenu);
				
				tipoMenuDTO.setIdTipoMenu(tipoMenu.getIdTipoMenu());
				tipoMenuDTO.setTipoMenu(tipoMenu.getTipoMenu());
				tiposMenuDTO.add(tipoMenuDTO);
			}
		}	
		loginMenuVO.setTiposMenu(tiposMenuDTO);
		loginMenuVO.setMenus(menusDTO);
		} catch (Exception e) {
			slf4jLogger.info("no se pudo obtenerMenus {}", e.toString());
			throw new SeguridadesException(e);
		}
		
		return loginMenuVO;
	}
}
